//! 区块数据结构模块，定义区块链的基本组成单元

use sha2::{Sha256, Digest};
use serde::{Serialize, Deserialize};
use crate::transaction::Transaction;
use crate::merkle_tree::MerkleTree;

/// 区块链中的区块结构
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Block {
    /// 区块高度（从0开始递增）
    pub index: u64, //u32,
    /// 区块创建时间戳（UNIX时间戳格式）
    pub timestamp: i64,
    /// 包含的交易列表
    pub transactions: Vec<Transaction>,
    /// 前一个区块的哈希值（用于形成链式结构）
    pub previous_hash: String,
    /// 当前区块的哈希值（根据区块内容计算）
    pub hash: String,
    /// 随机数（用于工作量证明计算）
    pub nonce: u64,
    /// 交易数据的默克尔树根哈希（用于快速验证交易完整性）
    pub merkle_root: String,
}

impl Block {
    /// 创建新区块
    /// # 参数
    /// - index: 区块高度  
    /// - timestamp: 时间戳  
    /// - transactions: 交易列表  
    /// - previous_hash: 前驱区块哈希  
    /// - nonce: 初始随机数  
    pub fn new(
        index: u64, // u32,
        timestamp: i64,
        transactions: Vec<Transaction>,
        previous_hash: String,
        nonce: u64
    ) -> Self {
        assert!(index > 0 || previous_hash == "0", "Genesis block rules");
        // 剩余初始化逻辑...

        // 构建默克尔树用于验证交易完整性
        // 将每笔交易的序列化数据作为叶子节点
        let merkle_tree = MerkleTree::new(
            transactions.iter()
                .map(|tx| tx.get_message()) // 获取交易签名消息
                .collect()
        );

        // 创建初始区块实例
        let mut block = Block {
            index,
            timestamp,
            transactions,
            previous_hash,
            hash: String::new(), // 初始空哈希，后续计算
            nonce,
            merkle_root: merkle_tree.root, // 从默克尔树获取根哈希
        };

        // 计算区块哈希值（包含所有元数据）
        block.hash = block.calculate_hash();
        block
    }

    /// 计算区块哈希（SHA256算法）
    /// 哈希输入包括：
    /// - 区块高度
    /// - 时间戳
    /// - 默克尔树
    /// - 前驱哈希
    /// - 当前nonce值
    pub fn calculate_hash(&self) -> String {
        // 拼接所有元数据为字符串
        let input = format!(
            "{}{}{}{}{}",
            self.index,
            self.timestamp,
            self.merkle_root,
            self.previous_hash,
            self.nonce
        );

        // 创建SHA256哈希器
        let mut hasher = Sha256::new();
        hasher.update(input);
        
        // 将哈希结果转换为十六进制字符串
        format!("{:x}", hasher.finalize())
    }

    /// 生成创世区块（区块链的第一个区块）
    /// 硬编码参数：
    /// - index: 0
    /// - timestamp: 2021-08-27 00:00:00 UTC
    /// - 空交易列表
    /// - 前驱哈希: "0"
    pub fn genesis() -> Self {
        Block::new(
            // 0,                      // 初始高度
	    0u64, // 明确指定为 u64 类型
            1630000000,             // 固定时间戳（示例值）
            Vec::new(),             // 无交易
            "0".to_string(),       // 特殊前驱哈希
            0                      // 初始nonce
        )
    }
}
